ここでは、他の回で採り上げなかったC++(C++98)とC言語(C89)の細かなちがいについて解説します。
可変個の実引数を取る関数の仮引数並び
C++では、printf 関数のような可変個の実引数を受け取る関数の仮引数並びを次のように記述することができました。
0 1 2 |
int printf(const char* format ...); /* C言語ではエラー */ |
しかし、C言語では、必ず … の前にコンマを記述する必要があります。
0 1 2 |
int printf(const char* format, ...); /* OK */ |
言語結合は使えない
C++では、extern “C”やextern “C++”のような「言語結合」を指定することができました。しかし、C言語にはこのような機能はありません。他言語のコーリングコンベンションにあわせるには、__pascal や __fortran のような独自拡張のキーワードを使うことはあるようです。
使用できる識別子
識別子に関しては、C++に比べてC言語のほうが制約がゆるいこともあれば、逆に制約が厳しいこともあります。
識別子途中の二重下線
C++では、識別の先頭だけでなく、途中や末尾にも二重の下線が含まれていてはいけません(予約名になります)。しかし、C言語では、先頭の二重下線は予約済み識別子になりますが、それ以外の場所に二重下線が含まれていても問題ありません。ただし、C++と共通で使用するヘッダファイルでは、C言語ではよくてもC++ではダメですので、途中や末尾に二重下線を含む識別子を使ってはいけません。
C++のキーワード
C言語にはないC++だけのキーワードは、C言語では識別子として使うことができます。ただ、無用の混乱を招くおそれがありますので、そうした識別子の使用は避けたほうがよいでしょう。
識別子の有意文字数
C++では、内部および外部識別子の有意文字数としては1024文字まで保証されます。しかし、C言語では非常に制約が厳しく、内部識別子は32文字、外部識別子は6文字までです。しかも、外部識別子の大文字小文字が区別されるかどうかは処理系定義です。規格上のことはともかく、近年の処理系に限れば、外部識別子も32字までは大丈夫と考えてもよいでしょう。大文字小文字については、コーリングコンベンションによっては区別されない場合もあります。
国際文字名
C++ では識別子に国際文字名または多バイト文字を使うことができました。しかし、C言語では英数字と下線しか使うことができません。なお、C++でも、国際文字名や多バイト文字は、規格上は使えることになっていますが、実際にサポートされる処理系は少ないため、このちがいが問題になることはそう多くありません。
代替字句
C++では、and, or, not, bitand, and_eqや、<%, %:などの代替字句を使うことができます。しかし、C89ではこれらの代替字句を使うことができません。ただし、C95以降ではandやorのような代替字句はマクロとして C言語とC++では、条件演算子の構文が微妙に異なります。具体的には、C++では、 であるのに対して、C言語では、 となっています。第3オペランドにコピー代入演算子や複合代入演算子を含む式を指定した場合、解釈が変わるので要注意です。条件演算子